package top.blueShark.template.common;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * VO（Value Object，值对象）是一种设计模式，用于表示应用程序中的数据对象或值。
 * 在Spring Boot中，VO通常用于表示从数据库中检索的数据，
 * 例如 实体对象的属性 或 DTO（Data Transfer Object，数据传输对象）中的数据。
 * <p>
 * VO通常包含数据字段（例如姓名、年龄、性别等）以及相应的getter和setter方法。
 * 在Spring Boot中，VO可以用于组织和传递数据，甚至可以进行数据校验和转换。
 *
 * @Result<T>定义一个返回的结果集
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> {

    private Integer code;
    private String message;
    private String error;
    private T data;


    /**
     * ✅ 第一个 <T>（定义方法的泛型类型）: 这是泛型方法的声明，表示这个静态方法是一个“泛型方法”，可以接受任意类型 T。
     * ✅ 第二个 T（表示返回值类型）: 这是方法的返回值类型的一部分，即返回的是 Result<T>，其中 T 是调用这个方法时你传入的具体类型（比如 String、Integer、某个对象类等）。
     * */
    public static <T> Result<T> success() {
        return new Result<>(0, "success", null, null);
    }

    public static <T> Result<T> success(String message) {
        return new Result<>(0, message, null, null);
    }

    public static <T> Result<T> success(T data) {
        return new Result<>(0, "success", null, data);
    }

    public static <T> Result<T> success(T data, String message) {
        return new Result<>(0, message, null, data);
    }


    public static <T> Result<T> fail() {
        return new Result<>(1, null, "fail", null);
    }

    public static <T> Result<T> fail(Integer code) {
        return new Result<>(code, null, "fail", null);
    }

    public static <T> Result<T> fail(String fail) {
        return new Result<>(1, null, fail, null);
    }

    public static <T> Result<T> fail(Integer code, String fail) {
        return new Result<>(code, null, fail, null);
    }

}
